home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Shareware World / Comms & Internet / DXF to VRML97 1.0.1 / src / DropUNIX Lib / ZSSDebug.c < prev    next >
Text File  |  1998-09-11  |  6KB  |  247 lines

  1. //============================================================================
  2. //
  3. //    This is the Think C 6.0 code to send a message to the DebugWindow server
  4. //    (in other words, this is the code to DebugWindow.Lib that came with your
  5. //    DebugWindow package).  I'm providing this code to document the AppleEvent
  6. //    procedures necessary to communicate with DebugWindow; those of you who
  7. //    need a specialized version, or need to port it to another environment
  8. //    (such as Pascal or MacApp) should find everything that you need to know
  9. //    right here.
  10. //
  11. //    If you implement this into a new environment, I'd appreciate it if you
  12. //    could send me the new modules so that I can include them with the next
  13. //    release of DebugWindow (with the proper credits going to you, of course!).
  14. //
  15. //
  16. //    Here are the necessary steps to send a string to DebugWindow:
  17. //
  18. //        • create an AppleEvent for signature 'LdbW' with a type of 'misc/dmsg'
  19. //          (for a standard printf-type message), or 'misc/dmsh' for a hex dump.
  20. //
  21. //        • add a parameter of type 'keyDirectObject/typeChar' passing a pointer
  22. //          to the string to display and its length
  23. //
  24. //        • send it on its way
  25. //
  26. //
  27. //    Modification history
  28. //    --------------------
  29. //
  30. //    Date     Version                Changes
  31. //    --------   -------      ---------------------------------
  32. //    11-19-93    2.0            • Added the interface to the DebugHexDump
  33. //                              routine in DebugWindow.
  34. //
  35. //                            • Added the ability to bracket displays to the
  36. //                              DebugWindow with a BeginDebug() and EndDebug()
  37. //                              envelope.  If you are doing large numbers of
  38. //                              Debug() calls, this can dramatically speed
  39. //                              things up.  This does NOT add any benefit to
  40. //                              the DebugHexDump() call, since all of the logic
  41. //                              for that function is in DebugWindow itself.
  42. //
  43. //============================================================================
  44.  
  45.  
  46. #include    <stdio.h>
  47. #include    <stdarg.h>
  48. #include    <string.h>
  49. #include    <AppleEvents.h>
  50. #include    <TextUtils.h>
  51. #include    <stdlib.h>
  52. #include    "ZSSDebug.h"
  53.  
  54. #define        MAX_STRING_SIZE        4096
  55. #define        CACHE_SIZE            8192        // size of display cache to allocate
  56.  
  57.  
  58.  
  59. void __SendToDebugWindow ( char *stringToSend, short length );
  60. void __FlushDebugWindowCache (void);
  61. void DebugCommand ( char *buffer, short length );
  62.  
  63.  
  64. short    __dbWinCount = 0;                    // counts number of BeginDebug calls
  65. char    *__dbCache  = nil;                    // holds our local display cache
  66. short    __cacheIndex = 0;                    // tail pointer for display cache
  67.  
  68.  
  69.  
  70. void Debug ( char *format, ... )
  71. {
  72.     va_list        argptr;
  73.     long        len;
  74.     char        *tDebugString;
  75.  
  76.     tDebugString = NewPtr ( MAX_STRING_SIZE );
  77.     if ( tDebugString ) {
  78.         va_start ( argptr, format );
  79.         len = (long)vsprintf ( tDebugString, format, argptr );
  80.         va_end ( argptr );
  81.         if ( len > 0 )
  82.             __SendToDebugWindow ( tDebugString, len );
  83.         DisposePtr ( tDebugString );
  84.     }
  85. }
  86.  
  87. void PDebug ( Str255 string )
  88. {
  89.     char * str;
  90.     str = p2cstr(string);
  91.     Debug("pstr = '%s'\n", str);
  92.     string = c2pstr(str);
  93. }
  94.  
  95.  
  96. void BeginDebug ()
  97. {
  98.     ++__dbWinCount;
  99. }
  100.  
  101.  
  102.  
  103.  
  104. void EndDebug ()
  105. {
  106.     --__dbWinCount;
  107.     if ( __dbWinCount == 0 )
  108.         __FlushDebugWindowCache();
  109. }
  110.  
  111.  
  112.  
  113.  
  114. void ClearDebugWindow ()
  115. {
  116.     DebugCommand ( "C", 1 );
  117. }
  118.  
  119.  
  120.  
  121.  
  122.  
  123. void DebugTimestamp ()
  124. {
  125.     DebugCommand ( "T", 1 );
  126. }
  127.  
  128.  
  129. void __dassert(int test, char * msg, char * testStr, char * file, unsigned long line) {
  130.  
  131.     if (!test) {
  132.         DebugTimestamp();
  133.         Debug("Failed assertion at %s:%uld:\n\t%s: %s\n", file, line, testStr, msg);
  134.     }
  135. }
  136.  
  137.  
  138.  
  139.  
  140. void __SendToDebugWindow ( char *stringToSend, short msgLength )
  141. {
  142.     if ( ! __dbCache )                                    // must be first time...
  143.         __dbCache = NewPtr ( CACHE_SIZE );
  144.  
  145.     if ( __dbCache ) {
  146.         if ( msgLength + __cacheIndex >= CACHE_SIZE )
  147.             __FlushDebugWindowCache();
  148.         memcpy ( __dbCache + __cacheIndex, stringToSend, msgLength );
  149.         __cacheIndex += msgLength;
  150.         if ( __dbWinCount == 0 )
  151.             __FlushDebugWindowCache();
  152.     }
  153. }
  154.  
  155.  
  156.  
  157.  
  158.  
  159. void DebugCommand ( char *buffer, short length )
  160. {
  161.     AppleEvent        appleEvent, reply;
  162.     AEAddressDesc    address;
  163.     OSType            targetSig;
  164.  
  165.     targetSig = 'LdbW';
  166.     if ( AECreateDesc ( typeApplSignature, (Ptr)&targetSig, 
  167.                         sizeof targetSig, &address ) == 0 ) {
  168.         if ( AECreateAppleEvent ( 'misc', 'dmsc', &address, kAutoGenerateReturnID,
  169.                                    kAnyTransactionID, &appleEvent ) == 0 ) {
  170.             if ( AEPutParamPtr ( &appleEvent, keyDirectObject, typeChar,
  171.                                  buffer, length ) == 0 ) {
  172.                 AESend ( &appleEvent, &reply, 
  173.                          kAEWaitReply + kAENeverInteract,
  174.                          kAENormalPriority, 
  175.                          300,                                 // up to 5 second wait..
  176.                          nil, nil );
  177.                 AEDisposeDesc ( &reply );
  178.             }
  179.             AEDisposeDesc ( &appleEvent );
  180.         }
  181.         AEDisposeDesc ( &address );
  182.     }
  183. }
  184.  
  185.  
  186.  
  187. void DebugHexDump ( char *buffer, short length )
  188. {
  189.     AEAddressDesc    address;
  190.     AppleEvent        appleEvent, reply;
  191.     OSType            targetSig;
  192.  
  193.     targetSig = 'LdbW';
  194.     if ( AECreateDesc ( typeApplSignature, (Ptr)&targetSig, 
  195.                         sizeof targetSig, &address ) == 0 ) {
  196.         if ( AECreateAppleEvent ( 'misc', 'dmsh', &address, kAutoGenerateReturnID,
  197.                                    kAnyTransactionID, &appleEvent ) == 0 ) {
  198.             if ( AEPutParamPtr ( &appleEvent, keyDirectObject, typeChar,
  199.                                  buffer, length ) == 0 ) {
  200.                 AESend ( &appleEvent, &reply, 
  201.                          kAEWaitReply + kAENeverInteract,
  202.                          kAENormalPriority, 
  203.                          300,                                 // up to 5 second wait..
  204.                          nil, nil );
  205.                 AEDisposeDesc ( &reply );
  206.             }
  207.             AEDisposeDesc ( &appleEvent );
  208.         }
  209.         AEDisposeDesc ( &address );
  210.     }
  211. }
  212.  
  213.  
  214.  
  215.  
  216.  
  217. void __FlushDebugWindowCache ()
  218. {
  219.     AEAddressDesc    address;
  220.     AppleEvent        appleEvent, reply;
  221.     OSType            targetSig;
  222.  
  223.     if ( __dbCache ) {
  224.         targetSig = 'LdbW';
  225.         if ( AECreateDesc ( typeApplSignature, (Ptr)&targetSig, 
  226.                             sizeof targetSig, &address ) == 0 ) {
  227.             if ( AECreateAppleEvent ( 'misc', 'dmsg', &address, kAutoGenerateReturnID,
  228.                                        kAnyTransactionID, &appleEvent ) == 0 ) {
  229.                 if ( AEPutParamPtr ( &appleEvent, keyDirectObject, typeChar,
  230.                                      __dbCache, __cacheIndex ) == 0 ) {
  231.                     AESend ( &appleEvent, &reply, 
  232.                              kAEWaitReply + kAENeverInteract,
  233.                              kAENormalPriority, 
  234.                              300,                                 // up to 5 second wait..
  235.                              nil, nil );
  236.                     AEDisposeDesc ( &reply );
  237.                 }
  238.                 AEDisposeDesc ( &appleEvent );
  239.             }
  240.             AEDisposeDesc ( &address );
  241.         }
  242.     }
  243.     __cacheIndex = 0;
  244. }
  245.  
  246.  
  247.